<div align="center">
<img src="./images/logo.png" width=250 />
</div>
<div align="center">
<h1>Axum Responses</h1>
</div>
<div align="center">
<a href="README.md" title="English README">馃嚭馃嚫 English</a>
|
<a href="README[ES].md" title="README en Espa帽ol">馃嚜馃嚫 Espa帽ol</a>
</div>
<div align="center">
<strong>Una forma sencilla de manejar respuestas y resultados en Axum</strong>
</div>
---
## Descripci贸n
**Axum Responses** es una biblioteca dise帽ada para simplificar la creaci贸n y manejo de respuestas HTTP en aplicaciones construidas con [Axum](https://github.com/tokio-rs/axum). Proporciona una abstracci贸n clara para manejar respuestas est谩ndar y personalizadas, junto con herramientas 煤tiles como macros para reducir la repetici贸n de c贸digo.
---
## Instalaci贸n
Agrega la dependencia en tu archivo `Cargo.toml`:
```toml
[dependencies]
axum_responses = "0.3.1"
```
Aseg煤rate de incluir tambi茅n las dependencias necesarias como `axum`, `serde` y `serde_json`.
---
## Caracter铆sticas
- **Respuestas est谩ndar y personalizadas**: Maneja respuestas HTTP comunes como `200 OK`, `404 Not Found`.
- **Macros 煤tiles**: Usa el macro `response!` para simplificar la creaci贸n de respuestas con c贸digos de estado y cuerpos personalizados.
- **Integraci贸n con Axum**: Dise帽ado espec铆ficamente para trabajar con el framework Axum.
---
## Ejemplo de Uso
### Respuestas est谩ndar y personalizadas
La enum `Response` incluye variantes para los c贸digos de estado HTTP m谩s comunes, como `Response::OK`, `Response::NOT_FOUND`, y m谩s. Tambi茅n puedes crear respuestas personalizadas con `Response::CUSTOM`.
```rust
use axum::{Router, routing::get};
use axum_responses::standard::Response;
use serde_json::json;
async fn handler() -> Response {
Response::OK
}
async fn custom_handler() -> Response {
Response::CUSTOM(201, json!({ "message": "Creado exitosamente" }))
}
fn app() -> Router {
Router::new()
.route("/", get(handler))
.route("/custom", get(custom_handler))
}
```
### Usando `HttpResponse` para respuestas m谩s flexibles
La estructura `HttpResponse` te permite construir respuestas con un c贸digo de estado, cuerpo JSON y cabeceras personalizadas utilizando un patr贸n builder.
```rust
use axum_responses::http::HttpResponse;
use axum::http::StatusCode;
use serde_json::json;
use serde::Serialize;
// Handler simple con HttpResponse
async fn http_response_handler() -> HttpResponse {
HttpResponse::build()
.status(StatusCode::OK)
.add_header("X-Custom-Header", "valor_custom")
.body(json!({ "message": "Hola desde HttpResponse" }))
}
// Handler usando el m茅todo `json()` para serializar structs
#[derive(Serialize)]
struct User {
id: u32,
username: String,
}
async fn http_response_json_struct_handler() -> HttpResponse {
let user_data = User {
id: 1,
username: "usuario_ejemplo".to_string(),
};
HttpResponse::build()
.status(StatusCode::OK)
.json(user_data) // Serializa autom谩ticamente User a JSON
}
// Ejemplo en una aplicaci贸n Axum
use axum::{Router, routing::get};
fn app_with_http_response() -> Router {
Router::new()
.route("/http", get(http_response_handler))
.route("/user", get(http_response_json_struct_handler))
}
```
### Macro `response!`
El macro `response!` permite crear respuestas `HttpResponse` con un c贸digo de estado y un cuerpo JSON de manera m谩s concisa. Tambi茅n soporta la auto-serializaci贸n de structs que implementan `Serialize`.
```rust
use axum_responses::{response, http::HttpResponse};
use serde::Serialize;
async fn example_handler() -> HttpResponse {
response!(200, { "status": "success", "data": "Ejemplo" })
}
async fn error_handler() -> HttpResponse {
response!(404, { "error": "Recurso no encontrado" })
}
#[derive(Serialize)]
struct Product {
id: String,
name: String,
price: f64,
}
async fn product_handler() -> HttpResponse {
let product_data = Product {
id: "prod_123".to_string(),
name: "Producto Ejemplo".to_string(),
price: 99.99,
};
// La struct product_data se serializar谩 autom谩ticamente a JSON
response!(201, { product_data })
}
async fn another_error_handler() -> HttpResponse {
response!(500, { "error": "Error interno del servidor" })
}
// Ejemplo en una aplicaci贸n Axum
use axum::{Router, routing::get};
fn app_with_macro() -> Router {
Router::new()
.route("/macro-example", get(example_handler))
.route("/macro-product", get(product_handler))
.route("/macro-error", get(error_handler))
}
```
### Diferencias entre `Response` y `HttpResponse`
- **`Response`**: Es una enumeraci贸n dise帽ada para manejar respuestas est谩ndar y personalizadas de manera sencilla. Es 煤til para controladores que necesitan devolver respuestas predefinidas.
- **`HttpResponse`**: Es una estructura m谩s flexible que permite definir un c贸digo de estado y un cuerpo JSON arbitrarios. Es ideal para casos donde necesitas un control m谩s granular sobre la respuesta con un patr贸n de dise帽o builder.
Ambos tipos implementan el trait `IntoResponse`, lo que significa que pueden ser utilizados directamente como respuestas en Axum.
---